package com.csi.juegoweb.web.backing;

import java.math.BigDecimal;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import com.csi.juegoweb.core.domain.Usuario;
import com.csi.juegoweb.core.service.UsuarioService;
import com.csi.juegoweb.domain.Donacion;
import com.csi.juegoweb.domain.Grupo;
import com.csi.juegoweb.domain.GrupoUsuario;
import com.csi.juegoweb.domain.Jugador;
import com.csi.juegoweb.service.DonacionService;
import com.csi.juegoweb.service.GrupoService;
import com.csi.juegoweb.service.GrupoUsuarioService;
import com.csi.juegoweb.service.JugadorService;
import com.csi.juegoweb.util.Mail;

public class LoginBean {

	private JugadorService jugadorService;

	private UsuarioService usuarioService;

	private GrupoService grupoService;

	private GrupoUsuarioService grupoUsuarioService;

	private DonacionService donacionService;

	private String serverPath;

	private Jugador jugador = null;

	private String email = "randresfigueroa@gmail.com";

	private String message;

	private List<com.csi.juegoweb.bean.JugadorBean> listHistorialDonaciones;

	private List<com.csi.juegoweb.bean.JugadorBean> listHistorialDonantes;

	private List<Usuario> listAmigos;

	private Mail mail;
	//Variable que contiene el email al que le corresponde donar
	private Jugador jugadorReceptor;
	
	private String mensajeCorreo;

	// //////////////// Action //////////////////

	@PostConstruct
	public void init() {
		jugador = new Jugador();
		HttpServletRequest request = (HttpServletRequest) getContext()
				.getExternalContext().getRequest();
		String codigo = request.getParameter("partner");

		if (codigo != null) {

			String[] campos = codigo.split("w");
			setEmail(campos[2]);
			jugador.setNoEmail(campos[2]);
			jugador.setCoPadre(campos[0]);
			getContext().addMessage(null, new FacesMessage("Juegoco Web",
					"Bienvenido, debe registrase!!!"));
		}
	}

	@SuppressWarnings("unused")
	public String entrar() {

		jugador = jugadorService.findByNoEmail(email);

		if (jugador != null) {
			System.out.println(jugador.getNoNombre());

			HttpSession session = (HttpSession) getContext().getExternalContext()
					.getSession(false);
			session.setAttribute("USER", jugador);

			// validar();

			cargarInformacion();
			validacionPrincipal();
			validarMiGrupo();
			return "invitar";
		} else {
			getContext().addMessage(null, new FacesMessage("Mensaje",
					"El usuario no existe!!"));
			return "";
		}

	}

	public String registrarme() {
		Usuario usuario = usuarioService.getUsuarioPorEmail(jugador
				.getNoEmail());
		if (usuario != null) {
			jugador.setCoPortal(usuario.getId());
			jugadorService.crear(jugador);

			HttpSession session = (HttpSession) getContext().getExternalContext()
					.getSession(false);
			session.setAttribute("USER", jugador);
			getContext().addMessage(null, new FacesMessage("Mensaje",
					"Debe invitar 2 amigos."));
			cargarInformacion();
			validacionPrincipal();
			validarMiGrupo();
			return "invitar";
		} else {
			getContext().addMessage(null, new FacesMessage("Mensaje",
					"Debe ser mienbro del Portal Comparte Amistad."));
			return "";

		}
	}

	public void cargarInformacion() {

		listAmigos = jugadorService.getListadoAmigos(jugador.getCoPortal()
				.toString());

		listHistorialDonaciones = jugadorService.HistorialDonaciones(jugador
				.getCoPortal().toString());

		listHistorialDonantes = jugadorService.HistorialDonantes(jugador
				.getCoPortal().toString());

		List<Jugador> jugadors = jugadorService.findByCoPadre(jugador
				.getCoPadre());
		/*
		if (jugadors.size() < 2) {
			getContext().addMessage(null, new FacesMessage("Mensaje",
					"Debe invitar 2 amigos."));
		}*/
	}

	@SuppressWarnings("unchecked")
	public void validacionPrincipal() {

		try {

			// Verificar si tiene grupo.
			List<GrupoUsuario> listGrupoUsuario = grupoUsuarioService
					.findByProperty("jugador.coJugador", jugador.getCoJugador());

			if (listGrupoUsuario.isEmpty()) {
				// Como no tiene grupo se le asignara a un grupo y a quien
				// debera donar
				validarAquienDonar();
			} else {
				// tiene grupo se verifica en que estado se encuentra
				// verificar en cuantos grupo esta y en que niveles se encuentra
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	@SuppressWarnings("unchecked")
	public void validarAquienDonar() {

		if (jugador.getCoPadre()!=null || jugador.getCoJugador()!=1){
			
			// Codigo de mi padre (El que me invito al Juego)
			System.out.println("padre :" + jugador.getCoPadre());

			// Verificar en que grupo esta mi padre para saber a quien tengo que
			// donar
			// Verificar si Mi Padre esta de Receptor
			List<Grupo> lisPadreReceptor = grupoService.findByProperty(
					"jugadorByCoJugreceptor.coJugador", Integer.parseInt(jugador.getCoPadre().toString()));

			if (lisPadreReceptor.isEmpty() && jugador.getCoJugador()!=1) {

				// Si no esta de receptor pertenece a un grupo, verificar en que
				// grupo se encuentra.
				List<GrupoUsuario> listGrupoUsuario = grupoUsuarioService
						.findByProperty("jugador.coJugador", jugador.getCoJugador());

				if (listGrupoUsuario.isEmpty()) {
					// Aun no se encuentra en un grupo tambien esta en espera
					message += "Usted no puede donar aun, Se encuentra en el estado de espera.";

				} else {
					// Se encontro al padre
					for (GrupoUsuario grupoUsuario : listGrupoUsuario) {
						// Se encontro el grupo
						Grupo grupo = grupoService.findById(grupoUsuario
								.getJugador().getCoJugador());

						// verificar si tiene cupo el grupo
						if (grupo.getQtUsuarios() < 8) {
							// Si puedo ingresar a este grupo, pero primero debo
							// donar
							message += "Usted debe donar a "
									+ grupo.getJugadorByCoJugreceptor()
											.getNoNombre();
							jugadorReceptor = jugadorService.findById(grupo.getJugadorByCoJugreceptor().getCoJugador());
							
							System.out.println("dddddddddddddddddddddddddd "+jugadorReceptor.getNoApemat());
							
							break;
						} else {
							// No puedo ingresar a este grupo
							// Buscar otro grupo donde pueda ingresar!!!!!!!!!!!!!!!
						}
					}

				}

			} else if (!lisPadreReceptor.isEmpty() && jugador.getCoJugador()!=1){
				// Mi padre es Receptor de un grupo, verificar si puedo ingresar en
				// ese grupo.

				for (Grupo grupo : lisPadreReceptor) {

					if (grupo.getQtUsuarios() < 8) {
						// Si puedo ingresar a este grupo, pero primero debo donar
						message += "Usted debe donar a "
								+ grupo.getJugadorByCoJugreceptor().getNoNombre();
						jugadorReceptor = jugadorService.findById(grupo.getJugadorByCoJugreceptor().getCoJugador());
						break;
					} else {
						// No puedo ingresar a este grupo
						// Buscar otro grupo donde pueda ingresar!!!!!!!!!!!!!!!
					}

				}

			}

			// /hasta aki ok la logica
			// =========================================================================================

			// Verificar a quien me toca donar

			// Verificar Si he donado al Receptor

			List<Donacion> listDonacion=donacionService.findByProperty("jugador.coJugador",
					jugador.getCoJugador(), "coJugdes", new Integer(jugador.getCoPadre()));

			List<Jugador> jugadors = jugadorService.findByCoPadre(jugador
					.getCoJugador().toString());

			if (jugador.getCoPadre() != null
					&& !jugador.getCoPadre().trim().equals("")) {

				// Verificar que he donado

				// Verificar que estoy en un grupo
				List<GrupoUsuario> listGrupoUsuario = grupoUsuarioService
						.findByProperty("jugador.coJugador", jugador.getCoJugador());

				// List<Grupo> listGrupos =
				// grupoService.findByProperty("jugadorByCoJugreceptor.coJugador",
				// jugador.getCoJugador());

				if (!listGrupoUsuario.isEmpty()) {

				} else {

				}

				message += "Debe hacer una donacion.";
				getContext().addMessage(null, new FacesMessage("Mensaje","Debe hacer una donacion."));
			} else {
				message += "No es necesario que realice una donacion.";
			}

		/*	if (jugadors.size() < 2) {
				message = "Debe Invitar a 2 amigos.";
			} else {
				message += "";
			}			
			*/
		}
		
	}
 
	@SuppressWarnings("unchecked")
	public void validarMiGrupo() {

		try {
			// Verificar que invite a 2 personas para poder seguir jugando e
			// integrarme a un grupo
			List<Jugador> jugadors = jugadorService.findByCoPadre(jugador
					.getCoJugador());

			// Verificar que minimo mis 2 amigos que invite esten activos es
			// decir jugando.
			
			if (jugadors!=null){
			 
				if (jugadors.size() < 2) {
					message = "Debe Invitar a 2 amigos.";
					getContext().addMessage(null, new FacesMessage(message,message));
				}else {

					// verificar en que grupo me encuentro
					List<GrupoUsuario> listGrupoUsuario = grupoUsuarioService
							.findByProperty("jugador.coJugador", jugador.getCoJugador());
	
					// Grupos en los que me encuentro
					for (GrupoUsuario grupoUsuario : listGrupoUsuario) {
						System.out.println(grupoUsuario.getJugador().getCoJugador());
					}
				}
								
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public String invitarAmigo() throws Exception {

		for (Usuario usuario : listAmigos) {
			if (usuario.getIndEmail()) {
			
				ServletContext serv = (ServletContext) getContext()
						.getExternalContext().getContext();
				System.out.println("-nom--" + usuario.getEmail());
				System.out.println("-check--" + usuario.getIndEmail());

				String url = serv.getInitParameter("serverPath")
						+ serv.getContextPath()
						+ "/login.jsf?partner="
						+ jugador.getCoJugador()
						+ "wfhnsdfjkn+gjaj242bgjklb3435asklgbd+f3434klgklfdbgd+fgjkbdjkfbgsdbhgw"
						+ usuario.getEmail() + "w" + usuario.getId();
				// el separador es w
				mail.send(
						usuario.getEmail(),
						"Invitacion a Juego",
						"Usted ha sido envitado al Juego"
								+ "por "
								+ jugador.getNoNombre()
								+ " "
								+ jugador.getNoApepat()
								+ "<br/>Favor ingrese a la siguente ruta: <a href=\""
								+ url + "\">Jugar</a>");
				getContext().addMessage(null, new FacesMessage("Mensaje",
						"Usted a invitado a " + usuario.getName()));
				mensajeCorreo = "Su mensaje ha sido enviado";
			}
		}
		return "invitar";

	}

	/**
	 * 
	 * @param coGrupo
	 * @param coJugador
	 *            Metodo para agregar al jugar a un grupo
	 */
	public void agregarJugarGrupo(Integer coGrupo, Integer coJugador) {

		try {

			// Buscar al grupo para saber cuantos integrantes tiene
			Grupo grupo = grupoService.findById(coGrupo);

			if ((grupo.getQtUsuarios() + 1) <= 8) {
				// Si se puede integera al grupo

				GrupoUsuario grupoUsuario = new GrupoUsuario();

				grupoUsuario.setGrupo(new Grupo(coGrupo));
				grupoUsuario.setJugador(new Jugador());

				grupoUsuarioService.save(grupoUsuario);

			} else {
				// No se puede integrar al grupo buscar otro grupo x mientras
				// estara en espera

			}

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	/**
	 * ok
	 * 
	 * @param idJugador
	 *            Metodo para realizar la donacion
	 */

	public void realizarDonacion(Integer coJugador, Integer coJugadorReceptor,
			Integer NivelCorresponde, BigDecimal monto,
			String emailJugadorReceptor, Integer codNivel) {

		try {
			Jugador jugador = jugadorService.findById(coJugador);

			// enviar email primeroo
			// Se enviara un mensaje a su email diciendo que le hara una
			// donacion que se hara efectiva en 72 horas horas desde
			// el momento que envio el mensaje
			// Se enviara el mensaje ademas se registrar en donacion pero son
			// confirmarr

			mail.send(
					emailJugadorReceptor,
					"Se le hara un donacion",
					"de parte de "
							+ jugador.getNoNombre()
							+ " "
							+ jugador.getNoApepat()
							+ " "
							+ jugador.getNoApemat()
							+ "Por favor comunicarse con esta persona para que le realice la donacion en 72 horas."
							+ " su correo es : " + jugador.getNoEmail());

			// Registrar en donacion pero sin confirmacion

			Donacion donacion = new Donacion();

			donacion.setJugador(new Jugador(coJugador));
			donacion.setNuMonto(monto);
			donacion.setCoJugdes(coJugadorReceptor);
			donacion.setCoNivel(codNivel);

			donacionService.crear(donacion);

		} catch (Exception e) {
			e.printStackTrace();
		}

	}
	
	@SuppressWarnings("unused")
	public void confirmarDonacion(Integer coJugador, Integer coJugadorReceptor,Integer NivelCorresponde,
			BigDecimal monto,String emailJugadorReceptor,Integer codNivel){
	
		try {
	
			//confirmar la donacion		
			
			mail.send(emailJugadorReceptor,
					"Se confirmo su donacion, ",
					"lo confirmo el jugador "+jugador.getNoNombre() + " " +
					jugador.getNoApepat() + " " + jugador.getNoApemat()+				
					" su correo es : "+jugador.getNoEmail());
			
			Donacion donacion= new Donacion();
			
			donacion = donacionService.findByPropertys("jugador.coJugador", coJugadorReceptor,
					"coJugdes", coJugador);
			
			donacion.setFlConfirn(1);
			donacion.setFcConfirn(new Date());
			
			donacionService.merge(donacion);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	
	}

	// //////////////////////////////////////////
	public Jugador getJugador() {
		return jugador;
	}

	public void setJugador(Jugador jugador) {
		this.jugador = jugador;
	}

	public JugadorService getJugadorService() {
		return jugadorService;
	}

	public void setJugadorService(JugadorService jugadorService) {
		this.jugadorService = jugadorService;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

	public List<com.csi.juegoweb.bean.JugadorBean> getListHistorialDonaciones() {
		return listHistorialDonaciones;
	}

	public void setListHistorialDonaciones(
			List<com.csi.juegoweb.bean.JugadorBean> listHistorialDonaciones) {
		this.listHistorialDonaciones = listHistorialDonaciones;
	}

	public List<com.csi.juegoweb.bean.JugadorBean> getListHistorialDonantes() {
		return listHistorialDonantes;
	}

	public void setListHistorialDonantes(
			List<com.csi.juegoweb.bean.JugadorBean> listHistorialDonantes) {
		this.listHistorialDonantes = listHistorialDonantes;
	}

	public List<Usuario> getListAmigos() {
		return listAmigos;
	}

	public void setListAmigos(List<Usuario> listAmigos) {
		this.listAmigos = listAmigos;
	}

	public GrupoService getGrupoService() {
		return grupoService;
	}

	public void setGrupoService(GrupoService grupoService) {
		this.grupoService = grupoService;
	}

	public GrupoUsuarioService getGrupoUsuarioService() {
		return grupoUsuarioService;
	}

	public void setGrupoUsuarioService(GrupoUsuarioService grupoUsuarioService) {
		this.grupoUsuarioService = grupoUsuarioService;
	}

	public Mail getMail() {
		return mail;
	}

	public void setMail(Mail mail) {
		this.mail = mail;
	}

	public String getServerPath() {
		return serverPath;
	}

	public void setServerPath(String serverPath) {
		this.serverPath = serverPath;
	}

	public UsuarioService getUsuarioService() {
		return usuarioService;
	}

	public void setUsuarioService(UsuarioService usuarioService) {
		this.usuarioService = usuarioService;
	}

	public DonacionService getDonacionService() {
		return donacionService;
	}

	public void setDonacionService(DonacionService donacionService) {
		this.donacionService = donacionService;
	}

	public FacesContext getContext() {
		return FacesContext.getCurrentInstance();
	}

	public Jugador getJugadorReceptor() {
		return jugadorReceptor;
	}

	public void setJugadorReceptor(Jugador jugadorReceptor) {
		this.jugadorReceptor = jugadorReceptor;
	}

	public String getMensajeCorreo() {
		return mensajeCorreo;
	}

	public void setMensajeCorreo(String mensajeCorreo) {
		this.mensajeCorreo = mensajeCorreo;
	}



}
